package com.x52im.rainbowchat.http.logic.logic;

import com.alibaba.fastjson.JSONObject;
import com.eva.framework.Processor;
import com.eva.framework.dbpool.DBShell;
import com.eva.framework.utils.EndsExceptionFactory;
import com.eva.framework.utils.LoggerFactory;
import com.x52im.rainbowchat.http.logic.AbstractJobDispatcher;
import com.x52im.rainbowchat.http.logic.LogicProcessor2;
import com.x52im.rainbowchat.http.logic.LogicUtils;

import java.util.Vector;

public class DeleteFriendJobDispatcher extends AbstractJobDispatcher {
    DBShell db = LogicProcessor2.db;

    /**
     * 维护删除好友.
     *
     * @param action_id 维护类型，SysConstant中的操作类型常量
     * @param newData   客端发送过来的本次修改新数据(可能为空，理论上与oldData不会同时空）
     * @param oldData   客端发送过来的本次修改前的老数据(可能为空，理论上与newData不会同时空）
     * @param userName  操作者的用户名
     * @return 返回给客户端的对象
     */
    @Override
    public String dispatch(int action_id, Object newDataJSON, Object oldData, Processor.User user) throws Exception {
        switch (action_id) {
            // 【接口1008-5-7】删除好友
            case ACTION_APPEND1:// ok
            {
                // 客户端传过来的数据
                JSONObject nwObj = JSONObject.parseObject(newDataJSON.toString());

                String myUid = nwObj.getString("local_uid");
                String friendUid = nwObj.getString("friend_uid");

                Vector sqls = new Vector();
                Vector values = new Vector();


                //********************* 先尝试存档聊天记录和删除未拉取的离线消息 *********//
                LogicUtils.prepareDeleteSingleChattingMsg(sqls, values, myUid, friendUid);


                //********************* 最后尝试删除好友关系记录 ************************//
                // 先把好友从我的好友列表中删除
                sqls.add("delete from missu_roster where user_uid=? and friend_user_uid=?");
                values.add(new Object[]{myUid, friendUid});
                // 再把我从好友的列表中删除
                sqls.add("delete from missu_roster where user_uid=? and friend_user_uid=?");
                values.add(new Object[]{friendUid, myUid});


                // 删除好友时，最佳逻辑是提前查询一下db看看是不是已被对主提前把“我”这个好友删除了，
                // 但为了性能——节省一次db查询，此处直接让它执行db删除插件，如果发生“影响行数为0”
                // 时即表示“我”已被对方提前删除。try catch的目的就是让此db执行效果静默执行，本来
                // 也不影响什么，防止将无意义的Exception发回给用户，影响体验
                try {
                    db.update(sqls, values, true);// Bug FIX 20170406：真的发生了只删除了一方好友信息。所以现改为必须事务，二条记录必须保证要么全在要么全不在
                } catch (Exception e) {
                    LoggerFactory.getLog().debug("[HTTP]在为用户" + myUid + "删除好友" + friendUid
                            + "时进入了非正常路径（\"" + e.getMessage() + "\"），原因可能是已提前被对方"
                            + "从好友列表中删除。（本行log出现不影响正常逻辑，请忽略之）");
                }

                return null;
            }

            default:
                throw EndsExceptionFactory.INVALID_ACTION_ID(action_id);
        }
    }
}
